home *** CD-ROM | disk | FTP | other *** search
- ;;; generic stream default methods
- ;;; Marcus Daniels 16.4.1994
-
- (in-package "LISP")
- (export '(generic-stream-read-char
- generic-stream-listen
- generic-stream-clear-input
- generic-stream-write-char
- generic-stream-write-string
- generic-stream-finish-output
- generic-stream-force-output
- generic-stream-clear-output
- generic-stream-read-byte
- generic-stream-write-byte
- generic-stream-close
- generic-stream-controller
- ) )
-
- (in-package "SYSTEM")
-
- (clos:defclass generic-stream-controller () ())
-
- (clos:defgeneric generic-stream-read-char (controller))
- (clos:defgeneric generic-stream-listen (controller))
- (clos:defgeneric generic-stream-clear-input (controller))
- (clos:defgeneric generic-stream-write-char (controller ch))
- (clos:defgeneric generic-stream-write-string (controller string start len))
- (clos:defgeneric generic-stream-finish-output (controller))
- (clos:defgeneric generic-stream-force-output (controller))
- (clos:defgeneric generic-stream-clear-output (controller))
- (clos:defgeneric generic-stream-read-byte (controller))
- (clos:defgeneric generic-stream-write-byte (controller by))
- (clos:defgeneric generic-stream-close (controller))
-
- (clos:defmethod generic-stream-read-char ((controller generic-stream-controller))
- (declare (ignore controller))
- )
-
- (clos:defmethod generic-stream-listen ((controller generic-stream-controller))
- (declare (ignore controller))
- )
-
- (clos:defmethod generic-stream-clear-input ((controller generic-stream-controller))
- (declare (ignore controller))
- )
-
- (clos:defmethod generic-stream-write-char ((controller generic-stream-controller) ch)
- (declare (ignore controller ch))
- )
-
- (clos:defmethod generic-stream-write-string ((controller generic-stream-controller) string start len)
- (dotimes (i len)
- (generic-stream-write-char controller (schar string (+ start i)))
- ) )
-
- (clos:defmethod generic-stream-finish-output ((controller generic-stream-controller))
- (declare (ignore controller))
- )
-
- (clos:defmethod generic-stream-force-output ((controller generic-stream-controller))
- (declare (ignore controller))
- )
-
- (clos:defmethod generic-stream-clear-output ((controller generic-stream-controller))
- (declare (ignore controller))
- )
-
- (clos:defmethod generic-stream-read-byte ((controller generic-stream-controller))
- (declare (ignore controller))
- )
-
- (clos:defmethod generic-stream-write-byte ((controller generic-stream-controller) by)
- (declare (ignore controller by))
- )
-
- (clos:defmethod generic-stream-close ((controller generic-stream-controller))
- (declare (ignore controller))
- )
-
- #| ;; Example:
- ;; Alias streams just perform the required operation on another given stream.
- (defclass alias-controller (generic-stream-controller)
- ((orig-stream :initarg :orig-stream))
- )
- (defun make-alias-stream (orig-stream)
- (make-generic-stream
- (make-instance 'alias-controller :orig-stream orig-stream)
- ) )
- (defmethod generic-stream-read-char ((controller alias-controller))
- (with-slots (orig-stream) controller
- (read-char orig-stream nil nil)
- ) )
- (defmethod generic-stream-listen ((controller alias-controller))
- (with-slots (orig-stream) controller
- (if (listen orig-stream)
- 0 ; something available
- (let ((ch (read-char-no-hang orig-stream nil t)))
- (cond ((eql ch t) -1) ; eof
- ((null ch) +1) ; nothing available, not EOF
- (t (unread-char ch orig-stream) 0) ; something available
- ) ) ) ) )
- (defmethod generic-stream-clear-input ((controller alias-controller))
- (with-slots (orig-stream) controller
- (clear-input orig-stream)
- t
- ) )
- (defmethod generic-stream-write-char ((controller alias-controller) ch)
- (with-slots (orig-stream) controller
- (write-char ch orig-stream)
- ) )
- #| ; not needed, see general method above
- (defmethod generic-stream-write-string ((controller alias-controller) string start len)
- (with-slots (orig-stream) controller
- (dotimes (i len)
- (write-char (schar string (+ start i)) orig-stream)
- ) ) )
- |#
- (defmethod generic-stream-finish-output ((controller alias-controller))
- (with-slots (orig-stream) controller
- (finish-output orig-stream)
- ) )
- (defmethod generic-stream-force-output ((controller alias-controller))
- (with-slots (orig-stream) controller
- (force-output orig-stream)
- ) )
- (defmethod generic-stream-clear-output ((controller alias-controller))
- (with-slots (orig-stream) controller
- (clear-output orig-stream)
- ) )
- (defmethod generic-stream-read-byte ((controller alias-controller))
- (with-slots (orig-stream) controller
- (read-byte orig-stream nil nil)
- ) )
- (defmethod generic-stream-write-byte (i (controller alias-controller))
- (with-slots (orig-stream) controller
- (write-byte i orig-stream)
- ) )
- (defmethod generic-stream-close ((controller alias-controller))
- ; don't close orig-stream
- )
- |#
-
-